
#include "ListeTemp.h"


ListeTempQ * creerListeTempQ()
{
    ListeTempQ * LTQ = (ListeTempQ*)malloc(1 * sizeof(ListeTempQ));
    initListeTemp(LTQ);
    return LTQ;
}

void initListeTemp(ListeTempQ * Liste)
{
	Liste->taille_utilisee = 0;
	Liste->capacite = 1;
	Liste->tab = (Question *)malloc(sizeof(Question)*Liste->capacite);
}

void ajouterQuestion(ListeTempQ * Liste, const Question * Quest)
{
	int i;
	Liste->taille_utilisee++;

	if(Liste->taille_utilisee > Liste->capacite/3)
	{
		Question *temp = Liste->tab;
		Liste->capacite*=2;
		Liste->tab = (Question *)malloc(sizeof(Question)*Liste->capacite);
		for(i=0;i<Liste->taille_utilisee;i++)
			Liste->tab[i] = temp[i];
		free(temp);
	}
	initQuestion(&Liste->tab[Liste->taille_utilisee-1]);
	copierQuest(&Liste->tab[Liste->taille_utilisee-1],Quest);
}

void testamentListeTemp(ListeTempQ * Liste)
{
	int i;
	int j = nbrElementListeQ(Liste);
	for(i=j-1;i>=0;i--)
    {
        libereQuest(&Liste->tab[i]);
		Liste->taille_utilisee-=1;
    }
	Liste->taille_utilisee = 0;
	Liste->capacite = 0;
	free(Liste->tab);
}

void detruireListeTempQ(ListeTempQ ** Liste)
{
    testamentListeTemp(*Liste);
    free(*Liste);
    *Liste = NULL;
}

void supprimerElementListe(ListeTempQ * Liste, int position)
{
	if((position<0)||(position>Liste->taille_utilisee-1))
		exit(EXIT_FAILURE);
	else
	{
		int i;
		if(position < Liste->taille_utilisee-1)
        {
            for(i=position;i<Liste->taille_utilisee-1;i++)
            {
                copierQuest(&Liste->tab[i],&Liste->tab[i+1]);
            }
        }
        libereQuest(&Liste->tab[Liste->taille_utilisee-1]);

		Liste->taille_utilisee--;
		if(Liste->taille_utilisee < Liste->capacite/3)
		{
			Question *temp = Liste->tab;
			Liste->capacite/=2;
			Liste->tab = (Question *)malloc(sizeof(Question)*Liste->capacite);
			for(i=0;i<Liste->taille_utilisee;i++)
				Liste->tab[i] = temp[i];
			free(temp);
		}
	}
}

int nbrElementListeQ(const ListeTempQ * liste)
{
    return liste->taille_utilisee;
}

void initNbrAlea()
{
    srand(time(NULL));
}


void remplirQuestFichier(FILE * fic, ListeTempQ * ListeQ)
{
int i,j,k,nbrQ;
    char * ligne;
    Question * Q;

    unsigned int nbrligne = nbrLigneFichier(fic);
    printf("- Nbr de lignes : %u\n", nbrligne);
    nbrQ = nbrligne/6;
    printf("- Nbr de questions : %d\n", nbrQ);
    printf("* Extraction des questions...");

    /*Rempli chaque question et l'ajoute à la liste temporaire*/
    for(i=0;i<nbrQ;i++)
    {
        Q = creerQuestion();
        k = i*6+1;
        /**Rempli le champs Question*/
        ligne = (char*)malloc(64 * sizeof(char));
        lireLigne(fic, k, ligne);
        setQuest(Q, ligne);
        free(ligne);

        for(j=k+1;j<(i+1)*6;j++)
        {
            /**Rempli les champs Réponse*/
            ligne = (char*)calloc(64, sizeof(char));
            lireLigne(fic, j, ligne);
            setRepQuest(Q,ligne);
            free(ligne);
        }

        /**Ajoute la question à la liste temporaire*/
        ajouterQuestion(ListeQ,Q);
        detruireQuest(&Q);
    }
    printf(" okay *\n");

}


void testRegressionListeTemp()
{
    int i,j;
    char ligne1[] = "Question1";
    char rep11[] = "Reponse1.1";
    char rep12[] = "Reponse1.2";
    char ligne2[] = "Question2";
    char rep21[] = "Reponse2.1";
    char rep22[] = "Reponse2.2";
	Question * Q1;
	Question * Q2;
	Question * Q3;
	FILE * fic = NULL;
	ListeTempQ  * liste;
    printf("** Test regression : Liste temporaire de Question **\n");

    /** On initialise la liste et les questions*/
    liste = creerListeTempQ();
    printf("* Liste temporaire initialisée *\n");
    Q1 = creerQuestion();
    Q2 = creerQuestion();
    Q3 = creerQuestion();
    printf("* Questions initialisées *\n");

    /** On remplit les questions*/
    setQuest(Q1,ligne1);
    setRepQuest(Q1,rep11);
    setRepQuest(Q1,rep12);
    setRepQuest(Q1,rep11);
    setRepQuest(Q1,rep12);
    assert(Q1->Quest != NULL);
    setQuest(Q2,ligne2);
    setRepQuest(Q2,rep21);
    setRepQuest(Q2,rep22);
    setRepQuest(Q2,rep21);
    setRepQuest(Q2,rep22);
    assert(Q2->Quest != NULL);
    printf("* Questions remplies *\n");

    /** On ajoute les questions à la liste temporaire*/
    ajouterQuestion(liste,Q1);
    ajouterQuestion(liste,Q2);
    ajouterQuestion(liste,Q1);
    ajouterQuestion(liste,Q2);
    i = nbrElementListeQ(liste);
    printf("* Il y a %d questions dans la liste temporaire *\n", i);

    /** On cherche le nombre de question contenue dans la liste*/
    initNbrAlea();
    j = nbrAleatoire(i);
    /*assert(j == 0 || j ==1);*/
    printf("* On va afficher la question n°%d (tiré aléatoirement) *\n", j+1);

    /** On affiche la question tirée aléatoirement*/
    copierQuest(Q3, &liste->tab[j]);
    assert(Q3->Quest != NULL);
    printf(" -> %s : %s\n", Q3->Quest, Q3->tabRep[0].rep);

    /** On supprime LA question tirée aléatoirement puis on recalcule le nombre de question dans la liste*/
    detruireQuest(&Q3);

    Q3 = creerQuestion();
    supprimerElementListe(liste,j);
    i = nbrElementListeQ(liste);
    j = nbrAleatoire(i);
    assert(i == 3);
    copierQuest(Q3, &liste->tab[j]);
    printf("* Puis la question restante *\n -> %s : %s\n", Q3->Quest, Q3->tabRep[0].rep);

    /** On vide entièrement la liste et on libère le tableau de la liste ET les questions*/
    printf("* Libération liste temporaire...");
    detruireListeTempQ(&liste);
    printf(" okay *\n");
    printf("* Libération questions...");
    detruireQuest(&Q1);
    detruireQuest(&Q2);
    detruireQuest(&Q3);
    printf(" okay *\n");
    liste = creerListeTempQ();

    suppLigneVide("./doc/Questions.txt");
	fic = fichierInit("./doc/Questions.txt");
    assert(fic != NULL);
    remplirQuestFichier(fic, liste);

	fclose(fic);

	detruireListeTempQ(&liste);
    printf("* Test regression liste temporaire de question : okay! *\n\n");
}
